package com.kkb.aop;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/*XML方式实现AOP*/
@Component //切面对象的创建权限依然交给spring容器
@Aspect  //aspectj 框架的注解 标识当前类是一个切面类
public class MyAOP {

    public void before(JoinPoint jp){
        System.out.println("AOP前置通知：在目标方法执行之前被调用的通知");
    }

    public void afterReturn(Object result){
        System.out.println("AOP后置通知：在目标方法执行之后被调用的通 知,result="+result);
    }

    public Object around(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("AOP环绕方法---目标方法的执行之前");
        Object proceed = pjp.proceed();
        System.out.println("AOP环绕方法---目标方法的执行之后");
        return proceed;
    }

    public void exception(JoinPoint jp,Throwable ex){
        //一般会把异常发生的时间、位置、原有都记录下来
        System.out.println("AOP异常通知：在目标方法执行出现异常的时候才会别调用的通知，否则 不执行");
        System.out.println(jp.getSignature()+"方法出现异常，异常信息 是："+ex.getMessage());
    }

    public void myFinally(){
        System.out.println("AOP最终通知：无论是否出现异常都是最后被调用的通知");
    }
}
